home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Diamond Collection / The Diamond Collection (Software Vault)(Digital Impact).ISO / cdr44 / ppl4c10.zip / ZDATE.C < prev    next >
Text File  |  1995-02-06  |  3KB  |  119 lines

  1. /* zdate.c */
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "datetime.h"
  6. #include "zdate.h"
  7.  
  8. #define BYTE unsigned char
  9. #define WORD unsigned int
  10.  
  11. #define  K1970  2440588L
  12. #define  K0        1461L
  13. #define  K1      146097L
  14. #define  K2     1721119L
  15.  
  16. void Greg2Julian(WORD Year,WORD Month,WORD Day,long *Julian)
  17. {long Century;
  18.  long XYear;
  19.  if(Month <= 2)
  20.     {Year--;
  21.      Month += 12;
  22.     }
  23.  Month -= 3;
  24.  Century = Year / 100;
  25.  XYear = Year % 100;
  26.  Century = (Century * K1) >> 2;
  27.  XYear = (XYear * K0) >> 2;
  28.  *Julian = ((((153L * (long)Month) + 2L) / 5L) + (long)Day)
  29.            + K2 + XYear + Century;
  30. }
  31.  
  32. void Julian2Greg(long Julian,WORD *Year,WORD *Month,WORD *Day)
  33. {long Temp;
  34.  long XYear;
  35.  WORD YYear;
  36.  WORD YMonth;
  37.  WORD YDay;
  38.  Temp = (((Julian - K2) << 2) - 1);
  39.  XYear = (Temp % K1) | 3;
  40.  Julian = Temp / K1;
  41.  YYear = (XYear / K0);
  42.  Temp = ((((XYear % K0) + 4) >> 2) * 5) - 3;
  43.  YMonth = Temp / 153;
  44.  if(YMonth >= 10)
  45.     {YYear++;
  46.      YMonth -= 12;
  47.     }
  48.  YMonth += 3;
  49.  YDay = Temp % 153;
  50.  YDay = (YDay + 5) / 5;
  51.  *Year = YYear + (WORD)(Julian * 100);
  52.  *Month = YMonth;
  53.  *Day = YDay;
  54. }
  55.  
  56. void Dos2Zdate(WORD Date,WORD Time,char *Text,int Length)
  57. {int  i, n;
  58.  char c;
  59.  BYTE Year;
  60.  BYTE Month;
  61.  BYTE Day;
  62.  BYTE Hour;
  63.  BYTE Minute;
  64.  BYTE Second;
  65.  long SecsPast;
  66.  long Julian;
  67.  long DaysPast;
  68.  /* begin */
  69.  UnpackDate(Date,&Year,&Month,&Day);
  70.  UnpackTime(Time,&Hour,&Minute,&Second);
  71.  Greg2Julian((WORD)(1900+Year),(WORD)Month,(WORD)Day,&Julian);
  72.  DaysPast = Julian - K1970;
  73.  SecsPast = 86400L * DaysPast;
  74.  SecsPast = SecsPast + (long)Hour * 3600L + (long)Minute * 60L
  75.               + (long)Second;
  76.  /* extract octal digits */
  77.  n = 0;
  78.  while( (SecsPast!=0L) && (n<Length) )
  79.    {
  80.     c = (char) ((SecsPast&0x07)+0x30);
  81.     Text[n++] = c;
  82.     SecsPast >>= 3;
  83.    }
  84.  Text[n] = '\0';
  85.  /* reverse digits */
  86.  for(i=0;i<n/2;i++)
  87.    {c = Text[i];
  88.     Text[i] = Text[n-i-1];
  89.     Text[n-i-1] = c;
  90.    }
  91. }
  92.  
  93. void Z2DosDate(char *Text,WORD *Date, WORD *Time)
  94. {int  n;
  95.  WORD Year;
  96.  WORD Month;
  97.  WORD Day;
  98.  WORD Hour;
  99.  WORD Minute;
  100.  WORD Second;
  101.  long SecsPast;
  102.  long Julian;
  103.  long DaysPast;
  104.  WORD Length;
  105.  Length = strlen(Text);
  106.  SecsPast = 0L;
  107.  for(n=0;n<Length;n++)
  108.    SecsPast = (SecsPast << 3) + (Text[n] - 0x30);
  109.  Julian = (SecsPast / 86400) + K1970;
  110.  Julian2Greg(Julian,&Year,&Month,&Day);
  111.  SecsPast = SecsPast % 86400;
  112.  Hour = SecsPast / 3600;
  113.  SecsPast = SecsPast % 3600;
  114.  Minute = SecsPast / 60;
  115.  Second = SecsPast % 60;
  116.  PackDate((BYTE)(Year-1900),(BYTE)Month,(BYTE)Day,(WORD *)Date);
  117.  PackTime((BYTE)Hour,(BYTE)Minute,(BYTE)Second,(WORD *)Time);
  118. }
  119.